package com.gs.common.tool.utils;

import com.gs.common.tool.consts.AttributeConst;
import lombok.extern.slf4j.Slf4j;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.util.Objects;

/**
 * xml工具类
 *
 * @author: guoshuai
 * @date: 2024/05/26 10:20
 **/
@Slf4j
public class XmlUtil {


    /**
     * 生成mapper.xml文件
     *
     * @param mapperPackageName java mapper包路径
     * @param fileName          文件名
     * @param filePath          文件路径
     * @date 2024/05/26 10:27
     **/
    public static void generateMapperXml(String mapperPackageName, String fileName, String filePath) {
        try {
            //解析
            SAXReader reader = new SAXReader();
            //加载模板
            Document doc = reader.read(XmlUtil.class.getClassLoader().getResourceAsStream("mapper-template.xml"));
            //得到xml文档根节点元素
            Element root = doc.getRootElement();
            //先移除属性，再重新赋值
            //root.attribute("namespace");
            root.addAttribute("namespace", mapperPackageName);
            //生成xml文件
            FileUtil.generateXmlFile(doc, filePath, fileName, null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 获取包路径
     *
     * @param basePackageName 基础包路径
     * @param element         元素
     * @date 2024/05/24 20:31
     **/
    public static String getPackage(String basePackageName, Element element) {
        if (Objects.isNull(element)) {
            return basePackageName;
        }
        boolean usePath = "true".equals(XmlUtil.getAttributeValue(element.attribute(AttributeConst.usePath)));
        if (usePath) {
            return element.attribute(AttributeConst.pack).getValue();
        }
        Attribute shortPack = element.attribute(AttributeConst.shortPack);
        if (Objects.isNull(shortPack)) {
            return basePackageName;
        }
        return String.format("%s.%s", basePackageName, shortPack.getValue());
    }


    /**
     * 获取文件路径
     *
     * @param basePath 基础路径
     * @param element  元素
     * @date 2024/05/24 20:31
     **/
    public static String getPath(String basePath, Element element) {
        if (Objects.isNull(element)) {
            return OsUtil.castPath(basePath);
        }
        //是否用全路径
        boolean usePath = "true".equals(XmlUtil.getAttributeValue(element.attribute(AttributeConst.usePath)));
        if (usePath) {
            return OsUtil.castPath(element.attribute(AttributeConst.path).getValue());
        }
        Attribute shortPath = element.attribute(AttributeConst.shortPath);
        if (Objects.isNull(shortPath)) {
            return OsUtil.castPath(basePath);
        }
        return OsUtil.castPath(String.format("%s%s%s", basePath, File.separator, shortPath.getValue()));
    }


    /**
     * 获取属性值
     *
     * @param attribute 属性
     */
    public static String getAttributeValue(Attribute attribute) {
        if (Objects.isNull(attribute)) {
            return null;
        }
        return attribute.getValue();
    }

    /**
     * 获取元素指定属性值
     *
     * @param element       元素
     * @param attributeName 属性名
     * @date 2024/07/11 10:49
     **/
    public static String getAttributeValue(Element element, String attributeName) {
        if (Objects.isNull(element)) {
            return "";
        }
        Attribute attribute = element.attribute(attributeName);
        if (Objects.isNull(attribute)) {
            return "";
        }
        return attribute.getValue();
    }


    /**
     * 是否真
     *
     * @param key key
     */
    public static boolean isTrue(String key) {
        return "true".equals(key);
    }
}
